package org.app.original;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import java.util.Vector;

public enum MyJSONEnum {
	

    STRING("\"%s\""){
		public <T>String decrypt(T temp){
			return String.format("\"%s\"", temp);
		}

	},
	NUMBER("%s"),LONG(""),INTEGER(""),SHORT(""),DOUBLE(""),FLOAT(""),BOOLEAN(""),

	PARALLEL("%s,"){///
		public <T>String decrypt(T t){
			int size=0;
			StringBuffer sb=new StringBuffer();
			try{
			size=Integer.parseInt(t.toString());
			}catch(Exception e){}
			
			for(int i=0;i<size;i++){
				sb.append("%s,");
			}
			//sb.setCharAt(sb.length()-1,' ');
			return sb.substring(0,sb.length()-1);//2
		}
	},
	
	ARRAY("[%s]"){
		public <T>String decrypt(T t){
			int size=0;
			Object values[]=null;
			if(t.getClass().isArray()){
				size=Array.getLength(t);
				values=new Object[size];
				for(int i=0;i<size;i++){
					Object obj=Array.get(t, i);
					String name=obj.getClass().getSimpleName().toUpperCase();
					values[i]=Enum.valueOf(MyJSONEnum.class, name).decrypt(obj);
				}
			}
			
			//return toArray(size,values);
			String parallel=PARALLEL.decrypt(size);
			StringBuffer sb=new StringBuffer();
			String val=String.format(parallel, values);
			sb.append(String.format(this.ARRAY.value, val));
			return  sb.toString();
		}

		public String decrypt(List list){
			int size=0;
			Object values[]=null;
			values=list.toArray();
			size=list.size();
			return "";
		}
		
		
	},
	
    HASHMAP("\"%s\":\"%s\""){
		public <T>String decrypt(T t){
			StringBuffer sb=new StringBuffer();
		Map<String,Object> map=(Map)t;
		Set<Entry<String,Object>> set = map.entrySet();
		
		
		List<String> list=new ArrayList();
		for(Entry<String,Object> entry:set){
			String key=entry.getKey();
			Object value=entry.getValue();
			if(value==null||value.toString().equals(""))continue;
			if(value.getClass().isArray()){
				value=ARRAY.decrypt(value);
			}else{
			String name=value.getClass().getSimpleName().toUpperCase();
			MyJSONEnum myEnum=Enum.valueOf(MyJSONEnum.class, name);
			value=myEnum.decrypt(value);
			}
			list.add(String.format("\"%s\":%s", key,value));
		}
		int size=list.size();
		 String parallel=PARALLEL.decrypt(size);
		 
		 sb.append(String.format("{%s}",String.format(parallel, list.toArray())));//MAPS.value
		

			return sb.toString();
		}

		
		
		
	};
	
	String value;
	public <T>String decrypt(T t){
		return t.toString();
	}
	/*
	protected String toArray(int size,Object[] values){/////
		String parallel=PARALLEL.decrypt(size);
		StringBuffer sb=new StringBuffer();
		String val=String.format(parallel, values);
		sb.append(String.format(MyJSONEnum.ARRAY.value, val));
		return  sb.toString();
	}
	*/
    MyJSONEnum(String value){
    	this.value=value;
    }
    
    public static void main(String[] args){
    	
    }
	
    
    
    
    
}
